/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package negocios;

import java.util.Calendar;

/**
 *
 * @author userlab23
 * Clase que gestiona los datos de una habitación
 */
public class Habitacion {

    /**
     * Campo de control de ID para las habitaciones. Privado e autoincrementable
     */
    private static int controlIdHabitaciones = 0;

    /**
     * Entero: ID de la habitación
     */
    private int idHabitacion;
    /**
     * Double: Precio de la habitación por noche
     */
    private double precio;
    /**
     * Entero: número de camas/personas por habitación
     */
    private int personas;
    /**
     * Entero: Número de registro de la habitación
     */
    private int numeroHabitacion;
    /**
     * Cliente: Puntero al objeto Cliente al cual la habitación está asignada. Si el campo es NULL, la habitación se encuentra desocupada
     */
    private Cliente asignada = null;
    /**
     * Fecha de ingreso de un cliente a una habitación. Si es NULL, la habitación no está asignada
     */
    private Calendar fechaIngreso;

    /**
     * Constructor del objeto Habitación. Crea el objeto Habitación, le asigna un ID e incrementa el controlador de ID.
     */
    public Habitacion()
    {
        idHabitacion = controlIdHabitaciones;
        controlIdHabitaciones++;
    }
    /**
     * Constructor parametizado del objeto Habitación. Crea el objeto Habitación, le asigna un ID e incrementa el controlador de ID.
     * @param precio double: precio de la habitación por noche
     * @param personas int: número de camas que contiene la habitación (capacidad de la habitación)
     * @param numeroHabitacion int: número de registro de la habitación (éste número es diferente del ID de habitación)
     */
    public Habitacion(double precio, int personas, int numeroHabitacion)
    {
        this.precio = precio;
        this.personas = personas;
        this.numeroHabitacion = numeroHabitacion;
        idHabitacion = controlIdHabitaciones;
        controlIdHabitaciones++;
    }
    /**
     * Método accesor del campo ID habitación
     * @return Entero: El número único de ID de una habitación
     */
    public int getIdHabitacion()
    {
        return this.idHabitacion;
    }
    /**
     * Método accesor del campo número de habitación
     * @return Entero: El número de habitación (es el número con el que un cliente identifica la habitación. Para uso interno del sistema, utilizar el campo IdHabitación)
     */
    public int getNumeroHabitacion()
    {
        return this.numeroHabitacion;
    }
    /**
     * Método accesor para el campo de capacidad de la habitación (personas o camas)
     * @return Entero: Número de personas o camas por habitación
     */
    public int getPersonas()
    {
        return this.personas;
    }
    /**
     * Método accesor del campo precio
     * @return double: Precio de la habitación por noche
     */
    public double getPrecio()
    {
        return this.precio;
    }
    /**
     * Método accesor para el campo de asignación.
     * @return Cliente: El objeto Cliente al que está asignada la habitación. Si es NULL, la habitación está desocupada.
     */
    public Cliente getAsignada()
    {
        return this.asignada;
    }
    /**
     * Método accesor para la fecha de ingreso del cliente a la habitación
     * @return Calendar: representa la fecha de ingreso
     */
    public Calendar getFechaIngreso()
    {
        return this.fechaIngreso;
    }
    /**
     * Método modificador del número de habitación
     * @param numeroHabitacion Entero: número de registro de la habitación (Diferente al ID de habitación)
     */
    public void setNumeroHabitacion(int numeroHabitacion)
    {
        this.numeroHabitacion = numeroHabitacion;
    }
    /**
     * Método modificador del precio de la habitación
     * @param precio double: Nuevo precio que se desea establecer para la habitación
     */
    public void setPrecio (double precio)
    {
        this.precio = precio;
    }
    /**
     * Método modificador de la capacidad de la habitación
     * @param personas Entero: Nueva capacidad que se desea establecer para la habitación
     */
    public void setPersonas(int personas)
    {
        this.personas = personas;
    }
    /**
     * Función de asignación de habitaciones a clientes
     * @param huesped Cliente: el objeto que representa al cliente al que se asigna la habitación
     * @param fechaIngreso Calendar: fecha en que el cliente le es asignada la habitación
     * @return Boolean: devuelve true si la asignación fue exitosa
     */
    public boolean fnvAsignarHabitacion(Cliente huesped, Calendar fechaIngreso)
    {
        this.asignada = huesped;
        this.fechaIngreso = fechaIngreso;
        return true;
    }
    /**
     * Función que informa sobre el estado actual de una habitación (ocupada o desocupada)
     * @return Boolean: True si la habitación está ocupada, de lo contrario retorna False
     */
    public boolean fnbAsignada()
    {
        if (this.asignada!=null)
            return true;
        else
            return false;
    }
    /**
     * Función que desocupa una habitación. Establece los campos Asignada y fechaIngreso como NULL. Calcula la cantidad de días que el huesped ocupó la habitación
     * @param fechaSalida Calendar: Fecha en la que el huesped desocupa la habitación
     * @return Entero: la cantidad de días que el cliente ocupó la habitación
     */
    public int fnbDesocupar(Calendar fechaSalida)
    {
        this.asignada = null;
        this.fechaIngreso = null;
        return fechaSalida.compareTo(this.fechaIngreso);
    }
    /**
     * Función que desocupa una habitación. Establece los campos Asignada y fechaIngreso como NULL. Calcula la cantidad de días que el huesped ocupó la habitación y calcula el monto a pagar por el hospedaje
     * @param fechaSalida Calendar: fecha en la que el huesped desocupa la habitación
     * @return La cantidad que el cliente debe pagar por hospedaje
     */
    public double fndoubleDesocuparCobrar(Calendar fechaSalida)
    {
        this.asignada = null;
        double dias = (double)fechaSalida.compareTo(this.fechaIngreso);
        this.fechaIngreso = null;
        return (dias * this.precio);
    }
}
